/**
 * 
 */
package modelo.tests;

import junit.framework.TestCase;
import modelo.MetodosNumericos.DiferenciasCentrales;
import modelo.MetodosNumericos.SeccionDoradaParaMaximo;
import modelo.MetodosNumericos.SeccionDoradaParaMinimo;
import modelo.MetodosNumericos.Simpson;
import modelo.abstraccionesGeometricas.Intervalo;
import modelo.abstraccionesGeometricas.Punto;
import modelo.excepciones.ValorNoPertenecienteAlDominio;
import modelo.funciones.Funcion;
import modelo.funciones.RaizCuadrada;
/**
 * @author Laura
 *
 */
public class RaizCuadradaTest extends TestCase implements IFuncionTest{

	private Funcion funcion;
	private Intervalo intervalo;
	
	/* (non-Javadoc)
	 * @see junit.framework.TestCase#setUp()
	 */
	
	protected void setUp() throws Exception {
		super.setUp();
		this.funcion = new RaizCuadrada();
		this.funcion.setMetodoParaDerivar(new DiferenciasCentrales());
		this.funcion.setMetodoParaIntegrar(new Simpson());
		this.funcion.setMetodoParaEncontrarMaximo(new SeccionDoradaParaMaximo());
		this.funcion.setMetodoParaEncontrarMinimo(new SeccionDoradaParaMinimo());
		intervalo= new Intervalo(0,1);
	}

	public void testEvaluar(){ 
		double doble = this.funcion.evaluar(16d);	
		assertTrue(doble == 4d);
	}
	
	public void testDerivar(){
		double valor= funcion.calcularDerivada(new Punto(4d,0d));
		boolean bandera=false;
		if (valor<0.2500001 && valor>0.2499999) bandera=true;
		assertTrue(bandera == true);
	}
	
	public void testLanzarExcepcion(){
		boolean bandera = false;
		try {
			double doble = this.funcion.evaluar(-16d);
		} catch (ValorNoPertenecienteAlDominio e) {
			bandera = true;
		} finally {
			assertTrue(bandera == true);
		}
	}

	public void testIntegrar() {
		double valor= this.funcion.integrar(intervalo);
		assertTrue(valor<0.6641 && valor >0.664);
	}

	public void testMaximo() {
		Punto maximo= funcion.Maximo(intervalo);
		assertTrue(maximo.getCoordenadaY()<1 && maximo.getCoordenadaY()>0.999);		
	}

	public void testMinimo() {
		Punto minimo = funcion.Minimo(intervalo);
		assertTrue(minimo.getCoordenadaY()<0.0012 && minimo.getCoordenadaY()>0.0011);
	}
}
